Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Jackson structured programming</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Jackson_structured_programming"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Jackson_structured_programming rootpage-Jackson_structured_programming skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Jackson structured programming</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">

<p><b>Jackson structured programming</b> (<b>JSP</b>) is a method for <a href="Structured_programming" title="Structured programming">structured programming</a> developed by British software consultant <a href="Michael_A._Jackson_(computer_scientist)" title="Michael A. Jackson (computer scientist)">Michael A. Jackson.</a> It was described in his 1975 book Principles of Program Design.<sup id="cite_ref-PoPD_1-0" class="reference"><a href="#cite_note-PoPD-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> The technique of JSP is to analyze the data structures of the files that a program must read as input and produce as output, and then produce a program design based on those data structures, so that the program control structure handles those data structures in a natural and intuitive way.
</p><p>JSP describes structures (of both data and programs) using three basic structures – sequence, iteration, and selection (or alternatives). These structures are diagrammed as (in effect) a visual representation of a <a href="Regular_expression" title="Regular expression">regular expression</a>.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Introduction">Introduction</h2></div>
<p><a href="Michael_A._Jackson_(computer_scientist)" title="Michael A. Jackson (computer scientist)">Michael A. Jackson</a> originally developed JSP in the 1970s. He documented the system in his 1975 book <i>Principles of Program Design</i>.<sup id="cite_ref-PoPD_1-1" class="reference"><a href="#cite_note-PoPD-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> In a 2001 conference talk,<sup id="cite_ref-perspective_2-0" class="reference"><a href="#cite_note-perspective-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> he provided a retrospective analysis of the original driving forces behind the method, and related it to subsequent software engineering developments. Jackson's aim was to make <a href="COBOL" title="COBOL">COBOL</a> <a href="Batch_file" title="Batch file">batch file</a> processing programs easier to modify and maintain, but the method can be used to design programs for any <a href="Programming_language" title="Programming language">programming language</a> that has structured control constructs— sequence, iteration, and selection ("if/then/else").
</p><p>Jackson Structured Programming was similar to <a href="Warnier/Orr_Diagrams" class="mw-redirect" title="Warnier/Orr Diagrams">Warnier/Orr structured programming</a><sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> although JSP considered both input and output data structures while the Warnier/Orr method focused almost exclusively on the structure of the output stream.
</p>
<div class="mw-heading mw-heading2"><h2 id="Motivation_for_the_method">Motivation for the method</h2></div>
<p>At the time that JSP was developed, most programs were batch COBOL programs that processed sequential files stored on tape. A typical program read through its input file as a sequence of records, so that all programs had the same structure— a single main loop that processed all of the records in the file, one at a time. Jackson asserted that this program structure was almost always wrong, and encouraged programmers to look for more complex data structures. In Chapter 3 of <i>Principles of Program Design</i><sup id="cite_ref-PoPD_1-2" class="reference"><a href="#cite_note-PoPD-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> Jackson presents two versions of a program, one designed using JSP, the other using the traditional single-loop structure. Here is his example, translated from COBOL into Java. The purpose of these two programs is to recognize groups of repeated records (lines) in a sorted file, and to produce an output file listing each record and the number of times that it occurs in the file.
</p><p>Here is the traditional, single-loop version of the program.
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span class="n">String</span><span class="w"> </span><span class="n">line</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="n">String</span><span class="w"> </span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>

<span class="c1">// begin single main loop</span>
<span class="k">while</span><span class="w"> </span><span class="p">((</span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">in</span><span class="p">.</span><span class="na">readLine</span><span class="p">())</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="o">!</span><span class="n">line</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">count</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">line</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">count</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">count</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
<p>Here is a JSP-style version of the same program. Note that (unlike the traditional program) it has two loops, one nested inside the other. The outer loop processes groups of repeating records, while the inner loop processes the individual records in a group.
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span class="n">String</span><span class="w"> </span><span class="n">line</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="n">numberOfLinesInGroup</span><span class="p">;</span>

<span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">in</span><span class="p">.</span><span class="na">readLine</span><span class="p">();</span>
<span class="c1">// begin outer loop: process 1 group</span>
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">line</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span>
<span class="w"> </span><span class="n">numberOfLinesInGroup</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">line</span><span class="p">;</span>

<span class="w"> </span><span class="c1">// begin inner loop: process 1 record in the group</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">line</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">line</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">numberOfLinesInGroup</span><span class="o">++</span><span class="p">;</span>
<span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">in</span><span class="p">.</span><span class="na">readLine</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">firstLineOfGroup</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">numberOfLinesInGroup</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
<p>Jackson criticises the traditional single-loop version for failing to process the structure of the input file (a sequence of groups containing repeating records) in a natural way. One sign of its unnatural design is that, in order to work properly, it is forced to include special code for handling the first and last record of the file.
</p>
<div class="mw-heading mw-heading2"><h2 id="The_basic_method">The basic method</h2></div>
<p>JSP uses semi-formal steps to capture the existing structure of a program's inputs and outputs in the structure of the program itself.
</p><p>The intent is to create programs which are easy to modify over their lifetime. Jackson's major insight was that requirement changes are usually minor tweaks to the existing structures. For a program constructed using JSP, the inputs, the outputs, and the internal structures of the program all match, so small changes to the inputs and outputs should translate into small changes to the program.
</p><p>JSP structures programs in terms of four component types:
</p>
<ul><li>fundamental operations</li>
<li>sequences</li>
<li>iterations</li>
<li>selections</li></ul>
<p>The method begins by describing a program's inputs in terms of the four fundamental component types. It then goes on to describe the program's outputs in the same way. Each input and output is modelled as a separate <a href="Data_structure_diagram" title="Data structure diagram">Data Structure Diagram</a> (DSD). To make JSP work for compute-intensive applications, such as <a href="Digital_signal_processing" title="Digital signal processing">digital signal processing</a> (DSP) it is also necessary to draw algorithm structure diagrams, which focus on internal data structures rather than input and output ones.
</p><p>The input and output structures are then unified or merged into a final program structure, known as a Program Structure Diagram (PSD). This step may involve the addition of a small amount of high level control structure to marry up the inputs and outputs. Some programs process all the input before doing any output, whilst others read in one record, write one record and iterate. Such approaches have to be captured in the PSD.
</p><p>The PSD, which is language neutral, is then implemented in a programming language. JSP is geared towards programming at the level of control structures, so the implemented designs use just primitive operations, sequences, iterations and selections. JSP is not used to structure programs at the level of classes and objects, although it can helpfully structure <a href="Control_flow" title="Control flow">control flow</a> within a class's methods.
</p><p>JSP uses a diagramming notation to describe the structure of inputs, outputs and programs, with diagram elements for each of the fundamental component types.
</p><p>A simple operation is drawn as a box.
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span><br>An operation</div>
<p>A sequence of operations is represented by boxes connected with lines. In the example below, A is a sequence consisting of operations B, C and D.
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span><br>A sequence</div>
<p>An iteration is again represented with joined boxes. In addition the iterated operation has a star in the top right corner of its box. In the example below, A is an iteration of zero or more invocations of operation B.
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span><br>An iteration</div>
<p>Selection is similar to a sequence, but with a circle drawn in the top right hand corner of each optional operation. In the example, A is a selection of one and only one of operations B, C or D.
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span><br>A selection</div><p>Note that it in the above diagrams, it is element A that is the sequence or iteration, not the elements B, C or D (which in the above diagrams are all elementary). Jackson gives the 'Look-down rule' to determine what an element is, i.e. look at the elements below an element to find out what it is.
</p><div class="mw-heading mw-heading2"><h2 id="A_worked_example">A worked example</h2></div>
<p>As an example, here is how a JSP programmer would design and code a <a href="Run-length_encoding" title="Run-length encoding">run length encoder</a>. A run length encoder is a program whose input is a stream of bytes which can be viewed as occurring in <i>runs</i>, where a run consists of one or more occurrences of bytes of the same value. The output of the program is a stream of byte pairs, where each byte pair is a compressed description of a run. In each pair, the first byte is the value of the repeated byte in a run and the second byte is a number indicating the number of times that that value was repeated in the run. For example, a run of eight occurrences of the letter "A" in the input stream ("AAAAAAAA") would produce "A8" as a byte pair in the output stream. Run length encoders are often used for crudely compressing bitmaps.
</p><p>With JSP, the first step is to describe the data structure(s) of a program's input stream(s). The program has only one input stream, consisting of zero or more <i>runs</i> of the same byte value. Here is the JSP data structure diagram for the input stream.
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span></div>
<p>The second step is to describe the output data structure, which in this case consists of zero or more iterations of byte pairs.
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span></div>
<p>The next step is to describe the correspondences between the components of the input and output structures.
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span></div>
<p>The next step is to use the correspondences between the two data structures to create a program structure that is capable of processing the input data structure and producing the output data structure. (Sometimes this isn't possible. See the discussion of <i>structure clashes</i>, below.)
</p>
<div class="center"><span class="mw-default-size" typeof="mw:File"></span></div>
<p>Once the program structure is finished, the programmer creates a list of the computational operations that the program must perform, and the program structure diagram is fleshed out by hanging those operations off of the appropriate structural components.
</p>
<ol><li>read a byte</li>
<li>remember byte</li>
<li>set counter to zero</li>
<li>increment counter</li>
<li>output remembered byte</li>
<li>output counter</li></ol>
<p>Also, at this stage conditions on iterations (loops) and selections (if-then-else or case statements) are listed and added to the program structure diagram.
</p>
<ol><li>while there are more bytes</li>
<li>while there are more bytes and this byte is the same as the run's first byte and the count will still fit in a byte</li></ol>
<p>Once the diagram is finished, it can be translated into whatever programming language is being used. Here is a translation into C.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdlib.h&gt;</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">c</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">first_byte</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">;</span>

<span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getchar</span><span class="p">();</span><span class="w"> </span><span class="cm">/* get first byte */</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">EOF</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* process the first byte in the run */</span>
<span class="w"> </span><span class="n">first_byte</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">c</span><span class="p">;</span>
<span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getchar</span><span class="p">();</span><span class="w"> </span><span class="cm">/* get next byte */</span>

<span class="w"> </span><span class="cm">/* process the succeeding bytes in the run */</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">EOF</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">first_byte</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* process one byte of the same value */</span>
<span class="w"> </span><span class="n">count</span><span class="o">++</span><span class="p">;</span>
<span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getchar</span><span class="p">();</span><span class="w"> </span><span class="cm">/* get next byte */</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="n">putchar</span><span class="p">(</span><span class="n">first_byte</span><span class="p">);</span>
<span class="w"> </span><span class="n">putchar</span><span class="p">(</span><span class="n">count</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">EXIT_SUCCESS</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Techniques_for_handling_difficult_design_problems">Techniques for handling difficult design problems</h2></div>
<p>In <i>Principles of Program Design</i> Jackson recognized situations that posed specific kinds of design problems, and provided techniques for handling them.
</p><p>One of these situations is a case in which a program processes two input files, rather than one. In 1975, one of the standard "wicked problems" was how to design a transaction-processing program. In such a program, a sequential file of update records is run against a sequential master file, producing an updated master file as output. (For example, at night a bank would run a batch program that would update the balances in its customers' accounts based on records of the deposits and withdrawals that they had made that day.) <i>Principles of Program Design</i> provided a standard solution for that problem, along with an explanation of the logic behind the design.
</p><p>Another kind of problem involved what Jackson called "recognition difficulties" and today we would call parsing problems. The basic JSP design technique was supplemented by POSIT and QUIT operations to allow the design of what we would now call a <a href="Backtracking" title="Backtracking">backtracking</a> parser.
</p><p>JSP also recognized three situations that are called "structure clashes"— a boundary clash, an ordering clash, and an interleaving clash— and provided techniques for dealing with them. In structure clash situations the input and output data structures are so incompatible that it is not possible to produce the output file from the input file. It is necessary, in effect, to write two programs— the first processes the input stream, breaks it down into smaller chunks, and writes those chunks to an intermediate file. The second program reads the intermediate file and produces the desired output.
</p>
<div class="mw-heading mw-heading2"><h2 id="JSP_and_object-oriented_design">JSP and object-oriented design</h2></div>
<p>JSP was developed long before object-oriented technologies became available. It and its successor method <a href="Jackson_system_development" title="Jackson system development">JSD</a> do not treat what now would be called "objects" as collections of more or less independent methods. Instead, following the work of <a href="C._A._R._Hoare" class="mw-redirect" title="C. A. R. Hoare">C. A. R. Hoare</a>, JSP and JSD describe software objects as <a href="Coroutine" title="Coroutine">co-routines</a>.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Jackson_system_development" title="Jackson system development">Jackson system development</a></li>
<li><a href="Warnier/Orr_diagram" title="Warnier/Orr diagram">Warnier/Orr diagram</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist reflist-columns references-column-width" style="column-width: 32em;">
<ol class="references">
<li id="cite_note-PoPD-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-PoPD_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-PoPD_1-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-PoPD_1-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFJackson1975" class="citation cs2">Jackson, MA (1975), <i>Principles of Program Design</i>, Academic</cite>.</span>
</li>
<li id="cite_note-perspective-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-perspective_2-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFJackson2001" class="citation cs2">Jackson, MA (2001), <a rel="nofollow" class="external text" href="http://mcs.open.ac.uk/mj665/JSPPers1.pdf"><i>JSP in Perspective</i></a> <span class="cs1-format">(PDF)</span>, sd&amp;m Pioneers’ Conference, Bonn, June 2001, <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170516215344/http://mcs.open.ac.uk/mj665/JSPPers1.pdf">archived</a> <span class="cs1-format">(PDF)</span> from the original on 2017-05-16<span class="reference-accessdate">, retrieved <span class="nowrap">2017-01-26</span></span></cite><span class="cs1-maint citation-comment"><code class="cs1-code">{{citation}}</code>: CS1 maint: location (link) CS1 maint: location missing publisher (link)</span></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite id="CITEREFWarnier1974" class="citation cs2">Warnier, JD (1974), <i>Logical Construction of Programs</i>, NY: Van Nostrand Reinhold</cite></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite id="CITEREFOrr1980" class="citation cs2">Orr, KT (1980), "Structured programming in the 1980s", <i>Proceedings of the ACM 1980 Annual Conference</i>, New York, NY: ACM Press, pp.&nbsp;<span class="nowrap">323–</span>26, <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F800176.809987">10.1145/800176.809987</a>, <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>978-0897910286</bdi>, <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:26834496">26834496</a></cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><cite id="CITEREFWieringa1998" class="citation cs2">Wieringa, R (Dec 1998), "A survey of structured and object-oriented software specification methods and techniques", <i>ACM Computing Surveys</i>, <b>30</b> (4): <span class="nowrap">459–</span>527, <a href="CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a>&nbsp;<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.107.5410">10.1.1.107.5410</a></span>, <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F299917.299919">10.1145/299917.299919</a>, <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:14967319">14967319</a></cite>.</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><cite id="CITEREFHenderson-SellersEdwards1990" class="citation cs2"><a href="Brian_Henderson-Sellers" title="Brian Henderson-Sellers">Henderson-Sellers, Brian</a>; Edwards, JM (Sep 1990), "The object-oriented systems life cycle", <i>Communications of the ACM</i>, <b>33</b> (9): <span class="nowrap">142–</span>59, <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F83880.84529">10.1145/83880.84529</a></span>, <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:14680399">14680399</a></cite>.</span>
</li>
</ol></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1290876196">
/* start https://en.wikipedia.org/ */


.mw-parser-output .side-box{margin:4px 0;box-sizing:border-box;border:1px solid #aaa;font-size:88%;line-height:1.25em;background-color:var(--background-color-interactive-subtle,#f8f9fa);display:flow-root}.mw-parser-output .infobox .side-box{font-size:100%}.mw-parser-output .side-box-abovebelow,.mw-parser-output .side-box-text{padding:0.25em 0.9em}.mw-parser-output .side-box-image{padding:2px 0 2px 0.9em;text-align:center}.mw-parser-output .side-box-imageright{padding:2px 0.9em 2px 0;text-align:center}@media(min-width:500px){.mw-parser-output .side-box-flex{display:flex;align-items:center}.mw-parser-output .side-box-text{flex:1;min-width:0}}@media(min-width:720px){.mw-parser-output .side-box{width:238px}.mw-parser-output .side-box-right{clear:right;float:right;margin-left:1em}.mw-parser-output .side-box-left{margin-right:1em}}


/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1237033735">
/* start https://en.wikipedia.org/ */


@media print{body.ns-0 .mw-parser-output .sistersitebox{display:none!important}}@media screen{html.skin-theme-clientpref-night .mw-parser-output .sistersitebox img[src*="Wiktionary-logo-en-v2.svg"]{background-color:white}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .sistersitebox img[src*="Wiktionary-logo-en-v2.svg"]{background-color:white}}


/* end https://en.wikipedia.org/ */
</style><div class="side-box side-box-right sistersitebox"><style data-mw-deduplicate="TemplateStyles:r1126788409">
/* start https://en.wikipedia.org/ */


.mw-parser-output .plainlist ol,.mw-parser-output .plainlist ul{line-height:inherit;list-style:none;margin:0;padding:0}.mw-parser-output .plainlist ol li,.mw-parser-output .plainlist ul li{margin-bottom:0}


/* end https://en.wikipedia.org/ */
</style>
<div class="side-box-flex">
<div class="side-box-image"><span class="noviewer" typeof="mw:File"></span></div>
<div class="side-box-text plainlist">Wikimedia Commons has media related to <span style="font-weight: bold; font-style: italic;"><a href="https://commons.wikimedia.org/wiki/Category:Jackson_Structured_Programming" class="extiw external" title="commons:Category:Jackson Structured Programming">Jackson Structured Programming</a></span>.</div></div>
</div>
<ul><li><a rel="nofollow" class="external text" href="http://www.sabretech.co.uk/pages/thought.html">A free graphical JSP Editor written in Java</a></li>
<li><a rel="nofollow" class="external text" href="https://www.his.se/en/about-us/staff/henrik.engstrom/jsp-editor/">A JSP editor</a></li>
<li><a rel="nofollow" class="external text" href="http://www.jacksonworkbench.co.uk/stevefergspages/jackson_methods/index.html">A brief history of the Jackson methods</a></li>
<li><a rel="nofollow" class="external text" href="http://www.jacksonworkbench.co.uk/">Jackson Workbench site</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-07-30" href="https://en.wikipedia.org/wiki/?title=Jackson_structured_programming&amp;oldid=1303284618">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>